package socratesteam.model.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import socratesteam.model.dominio.Categoria;
import socratesteam.model.dominio.Estado;
import socratesteam.model.excepcion.DAOExcepcion;
import socratesteam.model.util.ConexionBD;


public class CategoriaDAO extends BaseDAO {

	private static final long serialVersionUID = -3912606678334926060L;
	
	private Connection oConnection = null;
	private PreparedStatement oStatement = null;
	private ResultSet oSet = null;
	private String query = "";

	public Collection<Categoria> buscarPorNombre(String nombre)
			throws DAOExcepcion {
		String query = "select n_codigo, n_codigo_padre, c_nombre, c_descripcion, n_estado from tab_categoria where c_nombre like ?";
		Collection<Categoria> lista = new ArrayList<Categoria>();
		Connection oConnection = null;
		PreparedStatement oStatement = null;
		ResultSet rs = null;
		try {
			oConnection = ConexionBD.obtenerConexion();
			oStatement = oConnection.prepareStatement(query);
			oStatement.setString(1, "%" + nombre + "%");
			rs = oStatement.executeQuery();
			while (rs.next()) {
				Categoria oCategoria = new Categoria();
				oCategoria.setCodigo(rs.getInt("n_codigo"));
				oCategoria.setCodigoPadre(rs.getInt("n_codigo_padre"));
				oCategoria.setNombre(rs.getString("c_nombre"));
				oCategoria.setDescripcion(rs.getString("c_descripcion"));
				Estado x = new Estado();
				x.setCodigo(rs.getInt("n_estado"));
				oCategoria.setEstado(x);
				lista.add(oCategoria);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(oStatement);
			this.cerrarConexion(oConnection);
		}
		System.out.println(lista.size());
		return lista;
	}

	public Categoria insertar(Categoria oCategoria) throws DAOExcepcion {
		String query = "insert into tab_Categoria( c_nombre, c_descripcion, n_estado, n_codigo_padre) values (?,?,?,?)";
		Connection oConnection = null;
		PreparedStatement oStatement = null;
		ResultSet oSet = null;
		try {
			oConnection = ConexionBD.obtenerConexion();
			oStatement = oConnection.prepareStatement(query);
			oStatement.setString(1, oCategoria.getNombre());
			oStatement.setString(2, oCategoria.getDescripcion());
			oStatement.setInt(3, oCategoria.getEstado().getCodigo());
			oStatement.setInt(4, oCategoria.getCodigoPadre());
			int i = oStatement.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo insertar registro");				
			}
			System.out.println("Registro OK");
			// Obtener el codigo del ultimo registro insertado
			query = "SELECT LAST_INSERT_ID()";
			oStatement = oConnection.prepareStatement(query);
			oSet = oStatement.executeQuery();
			if (oSet.next()) {
				oCategoria.setCodigo(oSet.getInt(1));
			}
			
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(oSet);
			this.cerrarStatement(oStatement);
			this.cerrarConexion(oConnection);
		}
		return oCategoria;
	}


	public List<Categoria> listarCategorias() throws DAOExcepcion {
		List<Categoria> lista = new ArrayList<Categoria>();
		Categoria o;
		try {
			query = "SELECT C.N_CODIGO, C.N_CODIGO_PADRE, " +
					"CASE C.N_CODIGO_PADRE " +
					"WHEN 0 THEN '' " +
					"ELSE (SELECT N.C_NOMBRE FROM TAB_CATEGORIA N WHERE N.N_CODIGO = C.N_CODIGO_PADRE) " +
					"END AS C_NOMBRE_PADRE, " +
					"C.C_NOMBRE, C.C_DESCRIPCION, C.N_ESTADO " +
					"FROM TAB_CATEGORIA C WHERE C.N_ESTADO = 1";
			
			oConnection = ConexionBD.obtenerConexion();
			oStatement = oConnection.prepareStatement(query);
			oSet = oStatement.executeQuery();
			
			while (oSet.next()) {
				o = new Categoria();
				o.setCodigo(oSet.getInt(1));
				o.setCodigoPadre(oSet.getInt(2));
				o.setNombrePadre(oSet.getString(3));
				o.setNombre(oSet.getString(4));
				o.setDescripcion(oSet.getString(5));
				lista.add(o);
			}

		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(oSet);
			this.cerrarStatement(oStatement);
			this.cerrarConexion(oConnection);
		}
		return lista;
	}
	
	public List<Categoria> comboCategorias(Categoria oCategoria) throws DAOExcepcion {
		List<Categoria> lista = new ArrayList<Categoria>();
		Categoria o;
		try {
			query = "SELECT C.N_CODIGO, C.C_NOMBRE, " +
					"C.C_DESCRIPCION, C.N_ESTADO " +
					"FROM TAB_CATEGORIA C " +
					"WHERE C.N_CODIGO_PADRE = ? " +
					"AND C.N_ESTADO = 1";
			
			oConnection = ConexionBD.obtenerConexion();
			oStatement = oConnection.prepareStatement(query);
			oStatement.setInt(1, oCategoria.getCodigoPadre());
			oSet = oStatement.executeQuery();
			
			while (oSet.next()) {
				o = new Categoria();
				o.setCodigo(oSet.getInt(1));
				o.setNombre(oSet.getString(2));
				lista.add(o);
			}

		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(oSet);
			this.cerrarStatement(oStatement);
			this.cerrarConexion(oConnection);
		}
		return lista;
	}
	
}
